import { unref } from 'vue';
import { createLoading } from './createLoading';
import type { LoadingProps } from './typing';
import type { Ref } from 'vue';

export interface UseLoadingOptions {
    target?: any;
    props?: Partial<LoadingProps>;
}

interface Fn {
    (): void;
}

export function useLoading(props: Partial<LoadingProps>): [Fn, Fn, (string) => void];
export function useLoading(opt: Partial<UseLoadingOptions>): [Fn, Fn, (string) => void];

export function useLoading(
    opt: Partial<LoadingProps> | Partial<UseLoadingOptions>
): [Fn, Fn, (string) => void] {
    let props: Partial<LoadingProps>;
    let target: HTMLElement | Ref<ElRef> = document.body;

    if (Reflect.has(opt, 'target') || Reflect.has(opt, 'props')) {
        const options = opt as Partial<UseLoadingOptions>;
        props = options.props || {};
        target = options.target || document.body;
    } else {
        props = opt as Partial<LoadingProps>;
    }

    const instance = createLoading(props, undefined, true);

    const open = (): void => {
        const t = unref(target as Ref<ElRef>);
        if (!t) return;
        instance.open(t);
    };

    const close = (): void => {
        instance.close();
    };

    const setTip = (tip: string) => {
        instance.setTip(tip);
    };

    return [open, close, setTip];
}
